package com.zs.demo.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/* @Desc: 【全局跨域】解决前后端分离调用时跨域问题.注意安全风险,更细粒度的控制,可在方法上 @CrossOrigin(origins = "url")
 * @author:zhengs
 * @Time: 2018/11/20 13:31
 * @Copyright: © zhengs 版权所有
 * @Warning: 本内容仅限于本公司内部传阅,禁止外泄或用于其它商业目的
 */
@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter(){
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        /**
         * 表示预检请求的有效期，单位为秒,这里配置的是1天,
         * 浏览器的同源策略，就是出于安全考虑，浏览器会限制从脚本发起的跨域HTTP请求（比如异步请求GET, POST, PUT, DELETE, OPTIONS等等），
         * 所以浏览器会向所请求的服务器发起两次请求，第一次是浏览器使用OPTIONS方法发起一个预检请求，第二次才是真正的异步请求，
         * 第一次的预检请求获知服务器是否允许该跨域请求：如果允许，才发起第二次真实的请求；如果不允许，则拦截第二次请求。
         */
        corsConfiguration.setMaxAge(86400L);
        corsConfiguration.setAllowCredentials(true);//表示是否发送Cookie信息
        corsConfiguration.addAllowedOrigin("*");//表示允许哪些原始域进行跨域访问
        corsConfiguration.addAllowedHeader("*");//表示跨域请求的头部的允许范围
        corsConfiguration.addAllowedMethod("PUT");//表示跨域请求的方式的允许范围
        corsConfiguration.addAllowedMethod("GET");
        corsConfiguration.addAllowedMethod("POST");
        corsConfiguration.addAllowedMethod("PATCH");
        corsConfiguration.addAllowedMethod("OPTIONS");
        corsConfiguration.addAllowedMethod("DELETE");
        configSource .registerCorsConfiguration("/**", corsConfiguration);//添加映射路径
        return new CorsFilter(configSource);//返回新的CorsFilter
    }
}